package cn.wolfcode.web.controller;


import cn.wolfcode.common.exception.BusinessException;
import cn.wolfcode.common.web.Result;
import cn.wolfcode.domain.OrderInfo;
import cn.wolfcode.feign.AlipayFeignApi;
import cn.wolfcode.service.IOrderInfoService;
import cn.wolfcode.web.msg.SeckillCodeMsg;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;


@RestController
@RequestMapping("/orderPay")
@RefreshScope
public class OrderPayController {
    @Autowired
    private IOrderInfoService orderInfoService;
    @Autowired
    private AlipayFeignApi alipayFeignApi;

    @RequestMapping("alipay")
    public Result<String> alipay(String orderNo,int type){
        //参数检验
        if (StringUtils.isEmpty(orderNo) || StringUtils.isEmpty(type+"")){
            throw new BusinessException(SeckillCodeMsg.OPT_ERROR);
        }
        //根据支付类型做判断，判断是线上支付还是积分支付
        if (OrderInfo.PAYTYPE_ONLINE.equals(type)){
            //线上支付
            //result结果是form表单字符串
            String result = orderInfoService.payOnline(orderNo,type);
            return Result.success(result);
        }else if (OrderInfo.PAYTYPE_INTERGRAL.equals(type)){
            //积分支付
            orderInfoService.payIntergral(orderNo,type);
        }else {
            throw new BusinessException(SeckillCodeMsg.OPT_ERROR);
        }
        return Result.success("");
    }

    @Value("${pay.frontEndPayUrl}")
    private String frontEndPayUrl;

    @RequestMapping("return_url")
    public void return_url(@RequestParam Map<String,String> params, HttpServletResponse response) throws IOException {
        System.out.println("调用时间：" + new Date());
        System.out.println(params.toString());
        //远程调用支付服务进行验签操作
        Result<Boolean> result = alipayFeignApi.checkSign(params);
        //拿到订单编号
        String orderNo = params.get("out_trade_no");
        //——请在这里编写您的程序（以下代码仅作参考）——
        if(result!=null && !result.hasError()) {
            if (result.getData()){
                //跳转到订单详情页
                response.sendRedirect(frontEndPayUrl + orderNo);
            }else {
                response.sendRedirect("http://localhost/50x.html");
            }
        }
    }

    @RequestMapping("notify_url")
    public void notify_url(@RequestParam Map<String,String> params,HttpServletResponse response) throws IOException {
        System.out.println("异步回调：" + new Date());
        PrintWriter out = response.getWriter();
        //远程调用支付服务进行验签操作
        Result<Boolean> result = alipayFeignApi.checkSign(params);
        //拿到订单编号
        String orderNo = params.get("out_trade_no");
        if (result != null && !result.hasError()) {//验证成功
            if (result.getData()) {
                //实现支付成功逻辑
                orderInfoService.paySuccess(orderNo);
                out.write("success");
            } else {//验证失败
                out.write("fail");
            }
        }
    }

    @RequestMapping("refund")
    public Result<String> refund(String orderNo){
        //参数校验
        if (StringUtils.isEmpty(orderNo)){
            throw new BusinessException(SeckillCodeMsg.OPT_ERROR);
        }
        //根据订单编号把订单信息查询出来
        OrderInfo orderInfo = orderInfoService.find(orderNo);
        //判断订单支付类型是线上支付还是积分支付
        if (OrderInfo.PAYTYPE_ONLINE.equals(orderInfo.getPayType())){
            //在线退款
            orderInfoService.refundOnline(orderInfo);
        }else if (OrderInfo.PAYTYPE_INTERGRAL.equals(orderInfo.getPayType())){
            //积分退还
            orderInfoService.refundIntergral(orderInfo);
        }else {
            throw new BusinessException(SeckillCodeMsg.OPT_ERROR);
        }
        return Result.success("");
    }
}
